/*
 * @lc app=leetcode.cn id=10 lang=typescript
 *
 * [10] 正则表达式匹配
 */

// @lc code=start
function isMatch(s: string, p: string): boolean {
    let last: string | false = false;
    let regC = 0;
    let cursor = 0;
    if (s.length === 0) return false;
    while (cursor < s.length) {
        const target = s[cursor];
        const reg = p[regC];
        if (reg === ".") {
            // 点模式，直接忽略一个位置，并且存入 last
            regC++;
            last = ".";
            cursor++;
        } else if (reg === "*") {
            // 任何 .* 都是符合的
            if (last === ".") return true;
            if (target !== last) {
                // 结束星号模式
                regC++;
                continue;
            } else {
                // 星号匹配多个
                cursor++;
            }
        } else {
            if (target !== reg) {
                // 纯字符时，不相等直接打断
                if (p[regC + 1] === "*") {
                    last = reg;
                    // 这里 文本指针不能前进，因为知识结束了 *
                    // cursor++;
                    regC++;
                    continue;
                }
                return false;
            } else {
                last = reg;
                regC++;
                cursor++;
            }
        }
    }
    return true;
}
// @lc code=end
